package org.firstspringdema.dycdemo;

import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;


// @Bean("customService")
//指定该 Bean 在 Spring 容器中的名称为 "customService"，而不是默认的方法名 "customUserService"
//@Scope("prototype")
//设置 Bean 的作用域为原型模式，每次通过容器获取该 Bean 时都会创建新的实例。与默认的单例模式 (singleton) 不同，原型模式适合有状态的对象。
//@Primary
//当存在多个同类型 (UserService) 的 Bean 时，使用 @Autowired 注入时会优先选择带有 @Primary 注解的 Bean，解决了类型匹配的歧义问题。
//@Qualifier("custom")
//提供一个限定标识符，当需要精确指定注入某个 Bean 时，可以配合 @Autowired 使用 @Qualifier ("custom") 来明确指定注入 "customService"。

// 问题: 什么是多个同类型bean: 在 Spring 中，“同类型的 Bean” 指的是被 Spring 容器管理的、属于同一个类（或实现了同一个接口 / 继承了同一个父类）的多个 Bean 实例。
@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService("默认的用户服务");
    }

    // 注解配合
    @Bean
    @Scope("prototype")  // 原型模式：每次请求创建新实例
    @Primary   // 当有多个同类型Bean时，优先注入此Bean
    @Qualifier("custom") // // 提供限定符，用于精确注入
    public UserService customUserService() {
        return new UserService("自定义用户服务");
    }

    //  另一个同类型Bean，用于演示@Primary和@Qualifier的作用
    @Bean("adminService")
    @Qualifier("admin")
    public UserService adminUserService() {
        return new UserService("管理员用户服务");
    }

    // 依赖注入展示
    @Bean
    public UserController userController(@Qualifier("admin") UserService adminUserService) {
        return new UserController(adminUserService);
    }
}
